import { BaseProvider } from '@/lib/modules/llm/base-provider';
import type { ModelInfo } from '@/lib/modules/llm/types';
import type { IProviderSetting } from '@/types/model';
import type { LanguageModelV1 } from 'ai';
import { createOpenAI } from '@ai-sdk/openai';

export default class OpenAIProvider extends BaseProvider {
  name = 'OpenAI';
  getApiKeyLink = 'https://platform.openai.com/api-keys';

  config = {
    apiTokenKey: 'OPENAI_API_KEY',
  };

  staticModels: ModelInfo[] = [
    // { name: 'gpt-4.5-preview', label: 'GPT-4.5 Preview', provider: 'OpenAI', maxTokenAllowed: 16384 },
    { name: 'openai/chatgpt-4o-latest', label: 'GPT-4o', provider: 'OpenAI', maxTokenAllowed: 16384 },
    { name: 'openai/gpt-4o-mini', label: 'GPT-4o Mini', provider: 'OpenAI', maxTokenAllowed: 16384 },
    // { name: 'gpt-3.5-turbo', label: 'GPT-3.5 Turbo', provider: 'OpenAI', maxTokenAllowed: 8000 },
  ];

  // async getDynamicModels(
  //   apiKeys?: Record<string, string>,
  //   settings?: IProviderSetting,
  //   serverEnv?: Record<string, string>,
  // ): Promise<ModelInfo[]> {
  //   const { apiKey } = this.getProviderBaseUrlAndKey({
  //     apiKeys,
  //     providerSettings: settings,
  //     serverEnv: serverEnv as any,
  //     defaultBaseUrlKey: '',
  //     defaultApiTokenKey: 'OPENAI_API_KEY',
  //   });

  //   if (!apiKey) {
  //     throw `Missing Api Key configuration for ${this.name} provider`;
  //   }

  //   const response = await fetch(`https://api.openai.com/v1/models`, {
  //     headers: {
  //       Authorization: `Bearer ${apiKey}`,
  //     },
  //   });

  //   const res = (await response.json()) as any;
  //   const staticModelIds = this.staticModels.map((m) => m.name);

  //   const data = res.data.filter(
  //     (model: any) =>
  //       model.object === 'model' &&
  //       (model.id.startsWith('gpt-') || model.id.startsWith('o') || model.id.startsWith('chatgpt-')) &&
  //       !staticModelIds.includes(model.id),
  //   );

  //   return data.map((m: any) => ({
  //     name: m.id,
  //     label: `${m.id}`,
  //     provider: this.name,
  //     maxTokenAllowed: m.context_window || 32000,
  //   }));
  // }

  getModelInstance(options: {
    model: string;
    serverEnv?: Record<string, string>;
    apiKeys?: Record<string, string>;
    providerSettings?: Record<string, IProviderSetting>;
  }): LanguageModelV1 {
    const { model, serverEnv, apiKeys, providerSettings } = options;

    const { apiKey } = this.getProviderBaseUrlAndKey({
      apiKeys,
      providerSettings: providerSettings?.[this.name],
      serverEnv: serverEnv as any,
      defaultBaseUrlKey: '',
      defaultApiTokenKey: 'OPENAI_API_KEY',
    });

    if (!apiKey) {
      throw new Error(`Missing API key for ${this.name} provider`);
    }


    const openai = createOpenAI({
      apiKey: process.env.OPEN_ROUTER_API_KEY,
      baseURL: "https://openrouter.ai/api/v1",
    });

    return openai(model);
  }
}
